package agent; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; public class Agent { public static void premain(String agentArgs, Instrumentation inst) { inst.addTransformer(new ClassFileTransformer() { @Override public byte[] transform(ClassLoader classLoader, String s, Class<?> aClass, ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException { if ("other/Stuff".equals(s)) { // ASM Code ClassReader reader = new ClassReader(bytes); ClassWriter writer = new ClassWriter(reader, 0); ClassPrinter visitor = new ClassPrinter(writer); reader.accept(visitor, 0); return writer.toByteArray(); // Javassist // try { // ClassPool cp = ClassPool.getDefault(); // CtClass cc = cp.get("other.Stuff"); // CtMethod m = cc.getDeclaredMethod("run"); // m.addLocalVariable("elapsedTime", CtClass.longType); // m.insertBefore("elapsedTime = System.currentTimeMillis();"); // m.insertAfter("{elapsedTime = System.currentTimeMillis() - elapsedTime;" // + "System.out.println(\"Method Executed in ms: \" + elapsedTime);}"); // byte[] byteCode = cc.toBytecode(); // cc.detach(); // return byteCode; // } catch (Exception ex) { // ex.printStackTrace(); // } } return null; } }); } }